﻿using System;
using System.Configuration;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Data;
using System.Data.SqlClient;
//using GeneralUtilities;
using PrvDataModel;


namespace PRV_BO.Domain
{
    public class RotacionBO : IEditableObject, INotifyPropertyChanged, IDataErrorInfo
    {

        #region properties
        private bool m_Editing;

        private DateTime? _fechaEntradaOld;
        private DateTime? _fechaSalidaOld;

        private DateTime? _fechaEntrada;
        private DateTime? _fechaSalida;
//        private int _UGG;
//        private string _lote;

        [Browsable(false)]
        public bool IsNew { get; set; }

        [Browsable(false)]
        public Int32 ID { get; set; }

        //            [Browsable(false)]
        public string NombrePotrero { get; set; }

        public DateTime? FechaEntrada
        {
            get
            {
                return _fechaEntrada;
            }
            set
            {
				
                if ((value != DateTime.Parse("1900-01-01")) && (value > DateTime.Now.AddDays(1)))
                {
                    m_PropErrors["FechaEntrada"] = "Fecha Entrada debe estar en rango valido";
                    m_Error = "Fecha Entrada debe estar en rango valido";
                }
                else
                {
                    m_PropErrors["FechaEntrada"] = string.Empty;
                    m_Error = "";
                    _fechaEntrada = value;
                    FirePropertyChangedNotification("FechaEntrada");
                }
            }
        }

        public DateTime? FechaSalida
        {
            get
            {
                return (DateTime)((_fechaSalida == null) ? DateTime.Parse("1900-01-01") : _fechaSalida);
            }
            set
            {
                if (value != DateTime.Parse("1900-01-01") && (value < _fechaEntrada))
                {
                    m_PropErrors["FechaSalida"] = "Fecha salida debe ser posterior a fecha de entrada";
                    m_Error = "";
                    return;
                }

                if (value != DateTime.Parse("1900-01-01") && (value > DateTime.Now.AddDays(1)))
                {
                    m_PropErrors["FechaSalida"] = "Fecha salida no debe ser en el futuro";
                    m_Error = "";
                    return;
                }

                {
                    m_PropErrors["FechaSalida"] = string.Empty;
                    m_Error = "";
                    _fechaSalida = value;
                    FirePropertyChangedNotification("FechaSalida");
                }
            }
        }

        private int _Dias;
        public Int32 Dias
        {
            get
            {
                _Dias = 0;

                if (FechaSalida > FechaEntrada)
                {
                    _Dias = (short)((TimeSpan)(this.FechaSalida - FechaEntrada)).Days;
                    _Dias = (_Dias > 7300) ? 0 : _Dias;
                }

                return _Dias;
            }
        }

        [Browsable(true)]
        public Int32 DiasReposo
        {
            get
            {
                _Dias = 0;
                if (FechaSalida > FechaEntrada)
                {
                    _Dias = PresenterPRV.DiasReposo(NombrePotrero, this.FechaEntrada, this.FechaSalida);
                }

                return _Dias;
            }
        }

        [Browsable(true)]
        public string Lote { get; set; }

        internal RotacionesCollection m_Parent;

        #endregion

        #region constructor
        public RotacionBO(RotacionesCollection RC)
        {
            this.m_Parent = RC;
        }

        public RotacionBO(RotacionesCollection RC, string nombrePotrero,DateTime fechaEntrada, DateTime? fechaSalida,string lote,int idr)
        {
            this.m_Parent = RC;
            this.NombrePotrero = nombrePotrero;
            this.FechaEntrada = fechaEntrada;
            this.FechaSalida = (DateTime)((fechaSalida == null) ? DateTime.Parse("1900-01-01") : fechaSalida);

            this.Lote = lote;
            this.ID = idr;
        }

        #endregion

        #region IEditableObject Members

        public void BeginEdit()
        {
            if (!m_Editing)
            {
                _fechaEntradaOld = _fechaEntrada;
                _fechaSalidaOld = _fechaSalida;
//                _UGGOld = _UGG;
//                _loteOld = _lote;
            }

            m_Editing = true;
        }

        public void CancelEdit()
        {
            m_Editing = false;
        }

        public void EndEdit()
        {
            if (m_Editing)
            {
                //_fechaEntrada = _fechaEntradaOld;
                //_fechaSalidaOld = _fechaSalida;
                //_UGGOld = _UGG;
                //_loteOld = _lote;
            }

            m_Editing = false;
        }

        #endregion

        private void FirePropertyChangedNotification(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region IDataErrorInfo Members

        private string m_Error = string.Empty;
        private Hashtable m_PropErrors = new Hashtable();

        [Browsable(false)]
        public string Error
        {
            get { return m_Error; }
        }

        [Browsable(false)]
        public string this[string columnName]
        {
            get { return (string)m_PropErrors[columnName]; }
        }

        #endregion
    }

    public class RotacionDO 
    {
        public string NombrePotrero { get; set; }
        public DateTime FechaEntrada { get; set; }
        public DateTime FechaSalida { get; set; }
    }

    public class RotacionDOCollection : SortableBindingList<RotacionDO>
    {
        public RotacionDOCollection() : base() { }
    }

    public class RotacionesCollection : SortableBindingList<RotacionBO>
    {
        public RotacionesCollection() : base() { }
        public RotacionesCollection(IList<RotacionBO> ic) : base(ic) { }
    }

}
